# 百分比变化(pct_change)  该函数将每个元素与其前一个元素进行比较，并计算前后数值的百分比变化。
# 协方差(cov) Series 对象提供了一个cov方法用来计算 Series 对象之间的协方差。该方法也会将缺失值(NAN )自动排除。
# 相关系数(corr) 相关系数显示任意两个 Series 之间的线性关系。
# 排名(rank) rank() 按照某种规则（升序或者降序）对序列中的元素值排名

import pandas as pd
import numpy as np

# Series结构
s = pd.Series([1, 2, 3, 4, 5, 4])
print(s.pct_change())
# 0         NaN
# 1    1.000000
# 2    0.500000
# 3    0.333333
# 4    0.250000
# 5   -0.200000
# dtype: float64

# DataFrame
df = pd.DataFrame(np.random.randn(5, 2))
print(df.pct_change())
# 如果想要操作行，则需要传递参数 axis=1 参数
print(df.pct_change(axis=1))

# 协方差(cov)
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print(s1.cov(s2))

# Pandas 提供了计算相关性的三种方法，分别是 pearson(default)、spearman() 和 kendall()。
# 注意：如果 DataFrame 存在非数值(NAN），该方法会自动将其删除。
df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print(df['b'].corr(df['c']))
print(df.corr())

# 返回5个随机值，然后使用rank对其排名
s = pd.Series(np.random.randn(5), index=list('abcde'))
s['d'] = s['b']
print(s)
# a/b排名分别为2和3，其平均排名为2.5
print(s.rank())

# average：默认值，如果数据相同则分配平均排名；
# min：给相同数据分配最低排名；
# max：给相同数据分配最大排名；
# first：对于相同数据，根据出现在数组中的顺序进行排名。
# 按行排名，将相同数值设置为所在行数值的最大排名
a = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list("abdc"))
a = a.sort_index(axis=1, ascending=False)
a.iloc[[1, 1], [1, 2]] = 6
print(a.rank(axis=1, method="max"))
